/**
 * 防下载保护模块 - 最前沿的反下载技术
 */
class AntiDownloadProtection {
  constructor() {
    this.isEnabled = false
    this.originalFetch = null
    this.originalXMLHttpRequest = null
  }

  /**
   * 启用防护
   */
  enable() {
    if (this.isEnabled) return
    
    this.isEnabled = true
    console.log('🔒 启用防下载保护')
    
    // 1. 禁用开发者工具
    this.disableDevTools()
    
    // 2. 拦截网络请求
    this.interceptNetworkRequests()
    
    // 3. 禁用右键菜单
    this.disableContextMenu()
    
    // 4. 禁用快捷键
    this.disableShortcuts()
    
    // 5. 防止视频/音频下载
    this.protectMediaElements()
    
    // 6. 监控页面行为
    this.monitorPageBehavior()
  }

  /**
   * 禁用开发者工具检测
   */
  disableDevTools() {
    // 检测开发者工具是否打开
    let devtools = {
      open: false,
      threshold: 200  // 增加阈值，减少误报
    }

    setInterval(() => {
      if (window.outerHeight - window.innerHeight > devtools.threshold || 
          window.outerWidth - window.innerWidth > devtools.threshold) {
        if (!devtools.open) {
          devtools.open = true
          console.warn('⚠️ 检测到开发者工具打开')
          // 在开发环境中不重新加载页面
          if (process.env.NODE_ENV === 'production') {
            // window.location.reload()
          }
        }
      } else {
        devtools.open = false
      }
    }, 1000) // 降低检测频率

    // 禁用F12和其他开发者工具快捷键
    document.addEventListener('keydown', (e) => {
      if (e.key === 'F12' || 
          (e.ctrlKey && e.shiftKey && e.key === 'I') ||
          (e.ctrlKey && e.shiftKey && e.key === 'C') ||
          (e.ctrlKey && e.shiftKey && e.key === 'J') ||
          (e.ctrlKey && e.key === 'U')) {
        e.preventDefault()
        e.stopPropagation()
        return false
      }
    })
  }

  /**
   * 拦截网络请求
   */
  interceptNetworkRequests() {
    // 保存原始fetch
    this.originalFetch = window.fetch

    // 拦截fetch请求
    const protectionInstance = this
    window.fetch = (...args) => {
      const [url, options] = args
      
      // 检查是否是音频文件请求
      if (protectionInstance.isAudioRequest(url)) {
        console.log('🚫 拦截音频文件请求:', url)
        
        // 验证请求来源
        if (!protectionInstance.isValidAudioRequest(options)) {
          return Promise.reject(new Error('Unauthorized audio request'))
        }
      }
      
      return protectionInstance.originalFetch.apply(window, args)
    }

    // 拦截XMLHttpRequest
    this.originalXMLHttpRequest = window.XMLHttpRequest
    const self = this
    
    window.XMLHttpRequest = function() {
      const xhr = new self.originalXMLHttpRequest()
      const originalOpen = xhr.open
      
      xhr.open = function(method, url, ...args) {
        if (self.isAudioRequest(url)) {
          console.log('🚫 拦截XHR音频请求:', url)
          
          // 可以选择阻止请求或添加额外验证
          if (!self.isValidAudioRequest()) {
            throw new Error('Unauthorized audio request')
          }
        }
        
        return originalOpen.apply(this, [method, url, ...args])
      }
      
      return xhr
    }
  }

  /**
   * 检查是否是音频请求
   */
  isAudioRequest(url) {
    if (typeof url !== 'string') return false
    
    return url.includes('/api/files/songs/') || 
           url.includes('/secure-audio/') ||
           url.match(/\.(mp3|wav|ogg|aac|flac)$/i)
  }

  /**
   * 验证音频请求是否合法
   */
  isValidAudioRequest(options = {}) {
    // 检查是否有正确的来源标识
    return options.credentials === 'include' && 
           (options.headers?.['Accept']?.includes('audio') || 
            options.headers?.['Content-Type']?.includes('json'))
  }

  /**
   * 禁用右键菜单
   */
  disableContextMenu() {
    document.addEventListener('contextmenu', (e) => {
      e.preventDefault()
      return false
    })

    // 禁用图片和音频元素的右键菜单
    document.addEventListener('contextmenu', (e) => {
      if (e.target.tagName === 'IMG' || 
          e.target.tagName === 'AUDIO' || 
          e.target.tagName === 'VIDEO') {
        e.preventDefault()
        return false
      }
    })
  }

  /**
   * 禁用下载相关快捷键
   */
  disableShortcuts() {
    document.addEventListener('keydown', (e) => {
      // 只在音频播放器区域禁用快捷键
      const isInPlayerArea = e.target.closest('.music-player') || 
                            e.target.tagName === 'AUDIO' || 
                            e.target.tagName === 'VIDEO'
      
      if (isInPlayerArea) {
        // 禁用Ctrl+S (保存)
        if (e.ctrlKey && e.key === 's') {
          e.preventDefault()
          return false
        }
        
        // 禁用Ctrl+A (全选) - 仅在播放器区域
        if (e.ctrlKey && e.key === 'a') {
          e.preventDefault()
          return false
        }
        
        // 禁用Ctrl+C (复制) - 仅在播放器区域
        if (e.ctrlKey && e.key === 'c') {
          e.preventDefault()
          return false
        }
      }
      
      // 全局禁用打印
      if (e.ctrlKey && e.key === 'p') {
        e.preventDefault()
        return false
      }
    })
  }

  /**
   * 保护媒体元素
   */
  protectMediaElements() {
    // 监控新添加的音频/视频元素
    const observer = new MutationObserver((mutations) => {
      mutations.forEach((mutation) => {
        mutation.addedNodes.forEach((node) => {
          if (node.nodeType === Node.ELEMENT_NODE) {
            if (node.tagName === 'AUDIO' || node.tagName === 'VIDEO') {
              this.protectMediaElement(node)
            }
            
            // 检查子元素
            const mediaElements = node.querySelectorAll('audio, video')
            mediaElements.forEach(el => this.protectMediaElement(el))
          }
        })
      })
    })

    observer.observe(document.body, {
      childList: true,
      subtree: true
    })

    // 保护现有的媒体元素
    document.querySelectorAll('audio, video').forEach(el => {
      this.protectMediaElement(el)
    })
  }

  /**
   * 保护单个媒体元素
   */
  protectMediaElement(element) {
    // 隐藏控件
    element.controls = false
    element.controlsList = 'nodownload noremoteplayback'
    
    // 禁用右键
    element.addEventListener('contextmenu', (e) => {
      e.preventDefault()
      return false
    })
    
    // 禁用拖拽
    element.draggable = false
    element.addEventListener('dragstart', (e) => {
      e.preventDefault()
      return false
    })
    
    // 监控src变化，防止直接访问
    let originalSrc = element.src
    const self = this // 保存AntiDownloadProtection实例的引用
    
    // 保存原始的src属性描述符
    const originalDescriptor = Object.getOwnPropertyDescriptor(element, 'src') || 
                              Object.getOwnPropertyDescriptor(HTMLMediaElement.prototype, 'src')
    
    Object.defineProperty(element, 'src', {
      get() {
        return originalSrc
      },
      set(value) {
        // 验证src是否为安全URL
        if (self.isSecureUrl(value)) {
          originalSrc = value
          // 调用原始的setter来实际设置src
          if (originalDescriptor && originalDescriptor.set) {
            originalDescriptor.set.call(element, value)
          }
        } else {
          console.warn('🚫 阻止设置不安全的媒体URL:', value)
        }
      },
      configurable: true,
      enumerable: true
    })
  }

  /**
   * 验证是否为安全URL
   */
  isSecureUrl(url) {
    // 允许空字符串和null，这样可以正常清理音频元素
    if (!url || url === '') {
      return true
    }
    
    // 允许localhost音频URL用于开发环境
    if (url.includes('localhost:2025/api/files/songs/')) {
      console.warn('⚠️ 允许开发环境音频URL，但会监控使用:', url)
      return true
    }
    
    // 允许支持的外部音乐平台URL
    const supportedMusicPlatforms = [
      'music.163.com',
      'y.qq.com',
      'stream.qqmusic.qq.com',
      'kugou.com',
      'kuwo.cn',
      'soundcloud.com',
      'spotify.com'
    ]
    
    for (const platform of supportedMusicPlatforms) {
      if (url.includes(platform)) {
        console.log('🎵 允许外部音乐平台URL:', platform, url)
        return true
      }
    }
    
    return url.startsWith('blob:') || 
           url.includes('/secure-audio/') ||
           url.includes('data:audio') ||
           url.startsWith('data:') ||
           url === 'about:blank'
  }

  /**
   * 监控页面行为
   */
  monitorPageBehavior() {
    // 监控页面失焦
    document.addEventListener('visibilitychange', () => {
      if (document.hidden) {
        console.log('🔍 页面失焦，暂停所有音频播放')
        document.querySelectorAll('audio, video').forEach(el => {
          if (!el.paused) {
            el.pause()
          }
        })
      }
    })

    // 监控页面复制事件
    document.addEventListener('copy', (e) => {
      const selection = window.getSelection().toString()
      if (selection.includes('blob:') || selection.includes('http')) {
        e.preventDefault()
        console.log('🚫 阻止复制可能的媒体URL')
      }
    })
  }

  /**
   * 禁用防护
   */
  disable() {
    if (!this.isEnabled) return
    
    this.isEnabled = false
    console.log('🔓 禁用防下载保护')
    
    // 恢复原始函数
    if (this.originalFetch) {
      window.fetch = this.originalFetch
    }
    
    if (this.originalXMLHttpRequest) {
      window.XMLHttpRequest = this.originalXMLHttpRequest
    }
  }
}

// 创建单例实例
const antiDownloadProtection = new AntiDownloadProtection()

export default antiDownloadProtection 